<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>停用词与性能 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/stopwords-performance.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/stopwords-performance.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/stopwords-performance.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/stopwords-performance.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="languages.html">处理人类语言</a></span>
»
<span class="breadcrumb-link"><a href="stopwords.html">停用词: 性能与精度</a></span>
»
<span class="breadcrumb-node">停用词与性能</span>
</div>
<div class="navheader">
<span class="prev">
<a href="using-stopwords.html">« 使用停用词</a>
</span>
<span class="next">
<a href="common-terms.html">高低频词: 分而治之 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="stopwords-performance"></a>停用词与性能<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/240_Stopwords/30_Stopwords_and_performance.asciidoc">edit</a>
</h2>
</div></div></div>
<p>保留停用词最大的缺点就是影响搜索性能。使用 Elasticsearch 进行全文搜索，它需要为所有匹配的文档计算相关度评分 <code class="literal">_score</code> 从而返回最相关的前 10 个文档。</p>
<p>通常大多数的单词在所有文档中出现的频率低于0.1％，但是有少数词（例如 <code class="word">the</code> ）几乎存在于所有的文档中。假设有一个索引含有100万个文档，查询 <code class="word">quick brown fox</code> 词组，能够匹配上的可能少于1000个文档。但是如果查询 <code class="word">the quick brown fox</code> 词组，几乎需要对索引中的100万个文档进行评分和排序，只是为了返回前 10 名最相关的文档。</p>
<p>问题的关键是 <code class="word">the quick brown fox</code> 词组实际是查询 <code class="word">the</code> 或 <code class="word">quick</code> 或 <code class="word">brown</code> 或 <code class="word">fox</code>— 任何文档即使它什么内容都没有而只包含 <code class="word">the</code> 这个词也会被包括在结果集中。因此，我们需要找到一种降低待评分文档数量的方法。</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="stopwords-and"></a>and 操作符(<code class="term">operator</code>)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/240_Stopwords/30_Stopwords_and_performance.asciidoc">edit</a>
</h3>
</div></div></div>
<p>我们想要减少待评分文档的数量，最简单的方式就是在 <code class="literal">match</code> 查询时使用 <a class="xref" href="match-multi-word.html#match-improving-precision" title="提高精度"><code class="literal">and</code> 操作符</a>，这样可以让所有词都是必须的。</p>
<p>以下是 <code class="literal">match</code> 查询：</p>
<div class="pre_wrapper lang-json">
<pre class="programlisting prettyprint lang-json">{
    "match": {
        "text": {
            "query":    "the quick brown fox",
            "operator": "and"<a id="CO167-1"></a><i class="conum" data-value="1"></i>
             }
    }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO167-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>使用 <code class="literal">and</code> 操作符。</p>
</td>
</tr>
</table>
</div>
<p>上述查询会被ElasticSearch重写为<code class="literal">bool</code>查询：</p>
<div class="pre_wrapper lang-json">
<pre class="programlisting prettyprint lang-json">{
    "bool": {
        "must": [
            { "term": { "text": "the" }},
            { "term": { "text": "quick" }},
            { "term": { "text": "brown" }},
            { "term": { "text": "fox" }}
        ]
    }
}</pre>
</div>
<p><code class="literal">bool</code> 查询会智能的根据较优的顺序依次执行每个 <code class="literal">term</code> 查询：它会从最低频的词开始。因为所有词项都必须匹配，只有包含低频词的文档才有可能匹配。使用 <code class="literal">and</code> 操作符可以大大提升多词查询的速度。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_最少匹配数minimum_should_match"></a>最少匹配数(<code class="term">minimum_should_match</code>)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/240_Stopwords/30_Stopwords_and_performance.asciidoc">edit</a>
</h3>
</div></div></div>
<p>在精度匹配<a class="xref" href="match-multi-word.html#match-precision" title="控制精度">控制精度</a>的章节里面，我们讨论过使用 <code class="literal">minimum_should_match</code> 配置去掉结果中次相关的长尾。虽然它只对这个目的奏效，但是也为我们从侧面带来一个好处，它提供与 <code class="literal">and</code> 操作符相似的性能。</p>
<div class="pre_wrapper lang-json">
<pre class="programlisting prettyprint lang-json">{
    "match": {
        "text": {
            "query": "the quick brown fox",
            "minimum_should_match": "75%"
        }
    }
}</pre>
</div>
<p>在上面这个示例中，四分之三的词都必须匹配，这意味着我们只需考虑那些包含最低频或次低频词的文档。</p>
<p>相比默认使用 <code class="literal">or</code> 操作符的简单查询，这为我们带来了巨大的性能提升。不过我们有办法可以做得更好……</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="using-stopwords.html">« 使用停用词</a>
</span>
<span class="next">
<a href="common-terms.html">高低频词: 分而治之 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>